package es.gesfutbol.dao;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.hibernate.Hibernate;
import org.hibernate.LockMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.transaction.annotation.Transactional;

import es.gesfutbol.domini.implementacio.Equip;
import es.gesfutbol.domini.implementacio.Estadi;
import es.gesfutbol.util.HibernateDao;
import es.gesfutbol.util.HibernateHelper;

public class EquipDao extends HibernateDao<Equip, Long> implements IEquipDao{


	@Override
	@Transactional(readOnly=false)
	public void delete(Long idEquip) {
		//Obtenim l'equip a eliminar.
		Equip equip = this.findById(idEquip);
		//Eliminem l'equip.
		this.delete(equip);		
	}

	@SuppressWarnings("deprecation")
	@Transactional(readOnly = true)
	public Equip deproxy (Equip equip){
		//Estadi
		Estadi estadi = equip.getEstadi();
		Hibernate.initialize(estadi);
		estadi = HibernateHelper.deproxy(estadi, Estadi.class);
		equip.setEstadi(estadi);
		
		
		// Estadis Alternatius
		Set<Estadi> estadisAlternatius = equip.getEstadiAlternatiu();
		this.getSessionFactory().getCurrentSession().lock(equip, LockMode.NONE);
		Hibernate.initialize(estadisAlternatius);
		Iterator<Estadi> itEstadis = estadisAlternatius.iterator();
		Set<Estadi> estadis2 = new HashSet<Estadi>();
		while (itEstadis.hasNext()) {
			Estadi es = itEstadis.next();

			Hibernate.initialize(es);
			es = HibernateHelper.deproxy(es, Estadi.class);
			estadis2.add(es);
		}
		equip.setEstadiAlternatiu(estadis2);		
		
		return equip;
	}

	@Override
	@Transactional(readOnly=false)
	public void save(Equip equip) {
		this.getSessionFactory().getCurrentSession().saveOrUpdate(equip);
	}
	
	@Transactional(readOnly = true)
	public Equip findByNom(String nomEquip) {
		return (Equip) this.getSessionFactory().getCurrentSession().createCriteria(Equip.class)
		.add(Restrictions.eq("nom", nomEquip))
		.uniqueResult();
	}
}
